package frsf.cidisi.exercise.arq.search.actions;

import Entidades.Tesoro;
import frsf.cidisi.exercise.arq.search.*;
import frsf.cidisi.faia.agent.search.SearchAction;
import frsf.cidisi.faia.agent.search.SearchBasedAgentState;
import frsf.cidisi.faia.state.AgentState;
import frsf.cidisi.faia.state.EnvironmentState;

public class JuntarCofre extends SearchAction {

    /**
     * This method updates a tree node state when the search process is running.
     * It does not updates the real world state.
     */
    @Override
    public SearchBasedAgentState execute(SearchBasedAgentState s) {
        EstadoArqueologo agState = (EstadoArqueologo) s;
        
        Tesoro tesoroActual=agState.getTesoroCiudadActual();
        
        if(tesoroActual!=null) 
        {
         /*calcula si puede juntarlo en base a las restricciones de peso*/
        	double pesoActualTemp=agState.getpesoActual();
        	double pesoT=tesoroActual.getPeso();
        	double sumaTemp=pesoActualTemp+pesoT;
        	
        	double gananciaActualOroTemp=agState.getGananciaActualOro();
        	double gananciaOroTesoro=tesoroActual.getCantidadOro();
        	double sumaOro=gananciaActualOroTemp+gananciaOroTesoro;
        	
        	double gananciaActualRubiTemp=agState.getGananciaActualRubi();
        	double gananciaRubiTesoro=tesoroActual.getCantidadRubi();
        	double sumaRubi=gananciaActualRubiTemp+gananciaRubiTesoro;
        	
        	double gananciaActualColganteTemp=agState.getGananciaActualColgante();
        	double gananciaColganteTesoro=tesoroActual.getCantidadColgante();
        	double sumaColgante=gananciaActualColganteTemp+gananciaColganteTesoro;
        	
        	double gananciaActualDiamanteTemp=agState.getGananciaActualDiamante();
        	double gananciaDiamanteTesoro=tesoroActual.getCantidadDiamante();
        	double sumaDiamante=gananciaActualDiamanteTemp+gananciaDiamanteTesoro;
        	
        	double gananciaActualAnilloTemp=agState.getGananciaActualAnillo();
        	double gananciaAnilloTesoro=tesoroActual.getCantidadAnillo();
        	double sumaAnillo=gananciaActualAnilloTemp+gananciaAnilloTesoro;
        	
    
        	
                    
          if(sumaTemp<=EstadoArqueologo.CAPACIDAD){
        	 /*puede juntar el tesoro, por lo tanto lo junta*/
        	  
        	  agState.juntarTesoro(); /*esto borra el estado de la ciudad*/
        	  agState.setpesoActual(sumaTemp);
        	  agState.setGananciaActualAnillo(sumaAnillo);
        	  agState.setGananciaActualOro(sumaOro);
        	  agState.setGananciaActualDiamante(sumaDiamante);
        	  agState.setGananciaActualColgante(sumaColgante);
        	  agState.setGananciaActualRubi(sumaRubi);
  
        	  
        	  return agState;
          	}
          else
        	  return null; /*no puede cargar el tesoro por el peso*/
        }
        else
        	return null; /*no hay tesoro para cargar en la ciudad actual*/

    }

    /**
     * This method updates the agent state and the real world state.
     */
    @Override
    public EnvironmentState execute(AgentState ast, EnvironmentState est) {
    	
        EstadoIsla environmentState = (EstadoIsla) est;
        EstadoArqueologo agState = ((EstadoArqueologo) ast);
        
        Tesoro tesoroActual=environmentState.getTesoroCiudadActual();
        
        if (tesoroActual!=null) /*hay un tesoro*/ 
        {
          /*calcula si puede juntarlo en base a las restricciones de peso*/
        	
           double pesoActualTemp=agState.getpesoActual();
           double pesoT=tesoroActual.getPeso();
           double sumaTemp=pesoActualTemp+pesoT;
          
           if(sumaTemp<=EstadoArqueologo.CAPACIDAD) /*puede juntarlo y decide hacerlo*/
           {
           	// Update the real world
        	   environmentState.quitarTesoro(); /*remueve el tesoro de la ciudad actual*/   
        	      
            // Update the agent state
        	   
        	   	double gananciaOroTemp=agState.getGananciaActualOro();
        	   	double gananciaOroTesoro=tesoroActual.getCantidadOro();
        	   	double sumaOro=gananciaOroTemp+gananciaOroTesoro;
        	   	agState.setGananciaActualOro(sumaOro);
        	   	
        	   	double gananciaColganteTemp=agState.getGananciaActualColgante();
        	   	double gananciaColganteTesoro=tesoroActual.getCantidadColgante();
        	   	double sumaColgante=gananciaColganteTemp+gananciaColganteTesoro;
        	   	agState.setGananciaActualColgante(sumaColgante);
        	   	
        	   	double gananciaRubiTemp=agState.getGananciaActualRubi();
        	   	double gananciaRubiTesoro=tesoroActual.getCantidadRubi();
        	   	double sumaRubi=gananciaRubiTemp+gananciaRubiTesoro;
        	   	agState.setGananciaActualRubi(sumaRubi);
        	   	
        		double gananciaDiamanteTemp=agState.getGananciaActualDiamante();
        	   	double gananciaDiamanteTesoro=tesoroActual.getCantidadDiamante();
        	   	double sumaDiamante=gananciaDiamanteTemp+gananciaDiamanteTesoro;
        	   	agState.setGananciaActualDiamante(sumaDiamante);
        	   	
        	   	double gananciaAnilloTemp=agState.getGananciaActualAnillo();
        	   	double gananciaAnilloTesoro=tesoroActual.getCantidadAnillo();
        	   	double sumaAnillo=gananciaAnilloTemp+gananciaAnilloTesoro;
        	   	agState.setGananciaActualAnillo(sumaAnillo);
            	
            	agState.setpesoActual(sumaTemp);
            	
            	return environmentState;
           }
        	
           else /*si no puede juntar el tesoro por el peso*/
        	   return environmentState;   /*dejamos todo como estaba*/
           }

        else
        	return environmentState;/*si no hay tesoro*/
    }

    /**
     * This method returns the action cost.
     */
    @Override
    public Double getCost() {
        return new Double(0);
    }

    /**
     * This method is not important for a search based agent, but is essensial
     * when creating a calculus based one.
     */
    @Override
    public String toString() {
        return "JuntarCofre";
    }
}